/*
 * @lc app=leetcode.cn id=283 lang=cpp
 * @lcpr version=30204
 *
 * [283] 移动零
 */

// @lcpr-template-start
using namespace std;
#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
// @lcpr-template-end
// @lc code=start
class Solution
{
public:
    void moveZeroes(vector<int> &nums)
    {
        int n = nums.size();
        if (n == 0 || n == 1)
            return;

        int left = 0, right = 0;
        // 右指针不超过数组大小 O(N)
        while (right < n)
        {
            // 优先检测 r，确保 r 在 l 右侧
            if (right == left || nums[right] == 0)
            {
                right++;
            }
            else if (nums[left] != 0)
            {
                left++;
            }
            else
            {
                swap(nums[left], nums[right]);
            }
        }
    }
};
// @lc code=end

/*
// @lcpr case=start
// [0,1,0,3,12]\n
// @lcpr case=end

// @lcpr case=start
// [0]\n
// @lcpr case=end

 */
